{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5b3b1d10",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Image Manipulation\n",
    "\n",
    "Let's built a simple image manipulation API using Pillow and an LLM!\n",
    "\n",
    "The type of supported operations are limited to the list of functions created.\n",
    "\n",
    "The list of functions was generated using chat gpt (including type annotations and doc-strings).\n",
    "\n",
    "`Kork` doesn't know how to use kwargs yet, so the doc-strings that takes kwargs were modified with an explanation of what default value to use."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "85b99fbe",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "import sys\n",
    "\n",
    "sys.path.insert(0, \"../\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb23bdde",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Let's install Pillow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fff547dd",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.1.2\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3.10 -m pip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install Pillow > /dev/null"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f5d6533a",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from PIL import Image, ImageOps, ImageFilter"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50c116c4",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Let's create a functions manually"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b406a2b6",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def resize(img: Image.Image, width: int, height: int) -> Image:\n",
    "    \"\"\"Use to resize an image to the given width and height\"\"\"\n",
    "    return img.resize((width, height))\n",
    "\n",
    "\n",
    "def upscale(img: Image.Image, scale: float) -> Image.Image:\n",
    "    \"\"\"Upscale the image by the given scale\"\"\"\n",
    "    height = int(img.height * scale)\n",
    "    width = int(img.width * scale)\n",
    "    return img.resize((width, height))\n",
    "\n",
    "\n",
    "def downscale(img: Image.Image, scale: float) -> Image.Image:\n",
    "    \"\"\"Downscale the image by the given scale\"\"\"\n",
    "    return upscale(img, 1 / scale)\n",
    "\n",
    "\n",
    "def apply_sepia_filter(img: Image.Image) -> Image:\n",
    "    \"\"\"Apply a sepia filter.\"\"\"\n",
    "    # Convert the image to grayscale\n",
    "    grayscale_image = img.convert(\"L\")\n",
    "    # Apply sepia filter\n",
    "    sepia_image = ImageOps.colorize(grayscale_image, \"#704214\", \"#C0C090\")\n",
    "    return sepia_image"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b9edeec",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Below is a list of functions that was created (mostly) by chat gpt, so we don't have to write a lot of boiler plate by hand."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fd65000b",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "def apply_blur(img: Image.Image, radius: int = 2) -> Image.Image:\n",
    "    \"\"\"Apply a blur filter to the image. Use default radius of 2, if not specified.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "        radius (int): The blur radius. Default is 2.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.GaussianBlur(radius=radius))\n",
    "\n",
    "\n",
    "def apply_contour(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a contour filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.CONTOUR())\n",
    "\n",
    "\n",
    "def apply_detail(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a detail filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "        detail (int): The level of detail enhancement. Default is 2.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.DETAIL())\n",
    "\n",
    "\n",
    "def apply_edge_enhance(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply an edge enhance filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.EDGE_ENHANCE())\n",
    "\n",
    "\n",
    "def apply_edge_enhance_more(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a stronger edge enhance filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.EDGE_ENHANCE_MORE())\n",
    "\n",
    "\n",
    "def apply_emboss(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply an emboss filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.EMBOSS())\n",
    "\n",
    "\n",
    "def apply_find_edges(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a find edges filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.FIND_EDGES())\n",
    "\n",
    "\n",
    "def apply_sharpen(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a sharpen filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.SHARPEN)\n",
    "\n",
    "\n",
    "def apply_smooth(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a smooth filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.SMOOTH())\n",
    "\n",
    "\n",
    "def apply_smooth_more(img: Image.Image) -> Image.Image:\n",
    "    \"\"\"Apply a stronger smooth filter to the image.\n",
    "\n",
    "    Args:\n",
    "        img (Image.Image): The input image.\n",
    "\n",
    "    Returns:\n",
    "        Image.Image: The filtered image.\n",
    "    \"\"\"\n",
    "    return img.filter(ImageFilter.SMOOTH_MORE())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "01fbafa4",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from typing import List, Any, Optional\n",
    "\n",
    "import langchain\n",
    "from langchain.llms import OpenAI\n",
    "\n",
    "from kork.parser import parse\n",
    "from kork import InterpreterResult, Environment, run_interpreter, CodeChain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2127ca65",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "llm = OpenAI(temperature=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a14ceef0",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "examples = [\n",
    "    (\"resize the image to (20, 10)\", \"var result = resize(img, 20, 10)\"),\n",
    "    (\"apply sepia filter to the image\", \"var result = apply_sepia_filter(img)\"),\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f50f0575",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "examples_in_ast = [(query, parse(code)) for query, code in examples]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7176d256",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Let's get a test image from wikipedia."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "efe98c5d",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=100x120>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from io import BytesIO\n",
    "import requests\n",
    "\n",
    "\n",
    "def get_image(url: str) -> Image.Image:\n",
    "    \"\"\"Get an image from the given URL.\"\"\"\n",
    "    headers = {\n",
    "        \"User-Agent\": \"User-Agent: KorkDemo/0.0 (https://github.com/eyurtsev/kork/tree/main/kork;)\"\n",
    "    }\n",
    "    response = requests.get(url, headers=headers)\n",
    "\n",
    "    # Create a PIL image from the downloaded image data\n",
    "    img = Image.open(BytesIO(response.content))\n",
    "    return img\n",
    "\n",
    "\n",
    "url = \"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Orange_tabby_cat_sitting_on_fallen_leaves-Hisashi-01A.jpg/1024px-Orange_tabby_cat_sitting_on_fallen_leaves-Hisashi-01A.jpg\"\n",
    "\n",
    "img = get_image(url)\n",
    "resize(img, 100, 120)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "cbd4bf04",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "funcs = [\n",
    "    apply_blur,\n",
    "    apply_contour,\n",
    "    apply_detail,\n",
    "    apply_edge_enhance,\n",
    "    apply_edge_enhance_more,\n",
    "    apply_emboss,\n",
    "    apply_find_edges,\n",
    "    apply_sharpen,\n",
    "    apply_smooth,\n",
    "    apply_smooth_more,\n",
    "    resize,\n",
    "    apply_sepia_filter,\n",
    "    get_image,\n",
    "    downscale,\n",
    "    upscale,\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f25b0f5d",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "chain = CodeChain.from_defaults(\n",
    "    llm=llm,\n",
    "    examples=examples_in_ast,\n",
    "    interpreter=run_interpreter,\n",
    "    context=funcs,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "27d7d6f8-34f3-4018-8bf2-ce926ba42494",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from kork.display import as_html_dict, display_html_results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "dcec8718-788a-47e5-8f68-e6ddae1a9b9a",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "queries = [\n",
    "    \"resize the image to 100,100 and smooth it a lot\",\n",
    "    \"resize the image to 100,100 and sharpen\",\n",
    "    \"resize the image to 100, 100 and blur and apply sepia\",\n",
    "    \"resize the image to 100, 80, and then downscale it by another factor of 2x.\",\n",
    "    \"resize the image to 100, 90, and detect edges\",\n",
    "    \"resize the image to 100, 80, detect edges and finally apply sepia.\",\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "b647147e-a560-493d-a4ff-15fc981a7934",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "code_results = []\n",
    "for query in queries:\n",
    "    code_results.append(chain(inputs={\"query\": query, \"variables\": {\"img\": img}}))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "91acb21f-8002-41a7-9e67-96f3f306fe5d",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "html_results = [\n",
    "    as_html_dict(code_result, result_key=\"result\") for code_result in code_results\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "85f80108-94da-4bf8-979b-173c6f1d01f5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_bb6fb_row0_col0, #T_bb6fb_row0_col1, #T_bb6fb_row0_col2, #T_bb6fb_row1_col0, #T_bb6fb_row1_col1, #T_bb6fb_row1_col2, #T_bb6fb_row2_col0, #T_bb6fb_row2_col1, #T_bb6fb_row2_col2, #T_bb6fb_row3_col0, #T_bb6fb_row3_col1, #T_bb6fb_row3_col2, #T_bb6fb_row4_col0, #T_bb6fb_row4_col1, #T_bb6fb_row4_col2, #T_bb6fb_row5_col0, #T_bb6fb_row5_col1, #T_bb6fb_row5_col2 {\n",
       "  text-align: left;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_bb6fb\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_bb6fb_level0_col0\" class=\"col_heading level0 col0\" >query</th>\n",
       "      <th id=\"T_bb6fb_level0_col1\" class=\"col_heading level0 col1\" >code</th>\n",
       "      <th id=\"T_bb6fb_level0_col2\" class=\"col_heading level0 col2\" >result</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_bb6fb_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "      <td id=\"T_bb6fb_row0_col0\" class=\"data row0 col0\" >resize the image to 100,100 and smooth<br/>it a lot</td>\n",
       "      <td id=\"T_bb6fb_row0_col1\" class=\"data row0 col1\" ><style>pre { line-height: 125%; }<br/>td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>.output_html .hll { background-color: #ffffcc }<br/>.output_html { background: #f8f8f8; }<br/>.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */<br/>.output_html .err { border: 1px solid #FF0000 } /* Error */<br/>.output_html .k { color: #008000; font-weight: bold } /* Keyword */<br/>.output_html .o { color: #666666 } /* Operator */<br/>.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */<br/>.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */<br/>.output_html .cp { color: #9C6500 } /* Comment.Preproc */<br/>.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */<br/>.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */<br/>.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */<br/>.output_html .gd { color: #A00000 } /* Generic.Deleted */<br/>.output_html .ge { font-style: italic } /* Generic.Emph */<br/>.output_html .gr { color: #E40000 } /* Generic.Error */<br/>.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */<br/>.output_html .gi { color: #008400 } /* Generic.Inserted */<br/>.output_html .go { color: #717171 } /* Generic.Output */<br/>.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */<br/>.output_html .gs { font-weight: bold } /* Generic.Strong */<br/>.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */<br/>.output_html .gt { color: #0044DD } /* Generic.Traceback */<br/>.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */<br/>.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */<br/>.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */<br/>.output_html .kp { color: #008000 } /* Keyword.Pseudo */<br/>.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */<br/>.output_html .kt { color: #B00040 } /* Keyword.Type */<br/>.output_html .m { color: #666666 } /* Literal.Number */<br/>.output_html .s { color: #BA2121 } /* Literal.String */<br/>.output_html .na { color: #687822 } /* Name.Attribute */<br/>.output_html .nb { color: #008000 } /* Name.Builtin */<br/>.output_html .nc { color: #0000FF; font-weight: bold } /* Name.Class */<br/>.output_html .no { color: #880000 } /* Name.Constant */<br/>.output_html .nd { color: #AA22FF } /* Name.Decorator */<br/>.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */<br/>.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */<br/>.output_html .nf { color: #0000FF } /* Name.Function */<br/>.output_html .nl { color: #767600 } /* Name.Label */<br/>.output_html .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */<br/>.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */<br/>.output_html .nv { color: #19177C } /* Name.Variable */<br/>.output_html .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */<br/>.output_html .w { color: #bbbbbb } /* Text.Whitespace */<br/>.output_html .mb { color: #666666 } /* Literal.Number.Bin */<br/>.output_html .mf { color: #666666 } /* Literal.Number.Float */<br/>.output_html .mh { color: #666666 } /* Literal.Number.Hex */<br/>.output_html .mi { color: #666666 } /* Literal.Number.Integer */<br/>.output_html .mo { color: #666666 } /* Literal.Number.Oct */<br/>.output_html .sa { color: #BA2121 } /* Literal.String.Affix */<br/>.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */<br/>.output_html .sc { color: #BA2121 } /* Literal.String.Char */<br/>.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */<br/>.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */<br/>.output_html .s2 { color: #BA2121 } /* Literal.String.Double */<br/>.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */<br/>.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */<br/>.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */<br/>.output_html .sx { color: #008000 } /* Literal.String.Other */<br/>.output_html .sr { color: #A45A77 } /* Literal.String.Regex */<br/>.output_html .s1 { color: #BA2121 } /* Literal.String.Single */<br/>.output_html .ss { color: #19177C } /* Literal.String.Symbol */<br/>.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */<br/>.output_html .fm { color: #0000FF } /* Name.Function.Magic */<br/>.output_html .vc { color: #19177C } /* Name.Variable.Class */<br/>.output_html .vg { color: #19177C } /* Name.Variable.Global */<br/>.output_html .vi { color: #19177C } /* Name.Variable.Instance */<br/>.output_html .vm { color: #19177C } /* Name.Variable.Magic */<br/>.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">apply_smooth_more</span><span class=\"p\">(</span><br/><span class=\"w\">    </span><span class=\"n\">resize</span><span class=\"p\">(</span><br/><span class=\"w\">        </span><span class=\"n\">img</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">100</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">100</span><br/><span class=\"w\">    </span><span class=\"p\">)</span><br/><span class=\"p\">)</span><br/></pre></div></td>\n",
       "      <td id=\"T_bb6fb_row0_col2\" class=\"data row0 col2\" ><img src=\"\"></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_bb6fb_level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "      <td id=\"T_bb6fb_row1_col0\" class=\"data row1 col0\" >resize the image to 100,100 and sharpen</td>\n",
       "      <td id=\"T_bb6fb_row1_col1\" class=\"data row1 col1\" ><style>pre { line-height: 125%; }<br/>td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>.output_html .hll { background-color: #ffffcc }<br/>.output_html { background: #f8f8f8; }<br/>.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */<br/>.output_html .err { border: 1px solid #FF0000 } /* Error */<br/>.output_html .k { color: #008000; font-weight: bold } /* Keyword */<br/>.output_html .o { color: #666666 } /* Operator */<br/>.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */<br/>.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */<br/>.output_html .cp { color: #9C6500 } /* Comment.Preproc */<br/>.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */<br/>.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */<br/>.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */<br/>.output_html .gd { color: #A00000 } /* Generic.Deleted */<br/>.output_html .ge { font-style: italic } /* Generic.Emph */<br/>.output_html .gr { color: #E40000 } /* Generic.Error */<br/>.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */<br/>.output_html .gi { color: #008400 } /* Generic.Inserted */<br/>.output_html .go { color: #717171 } /* Generic.Output */<br/>.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */<br/>.output_html .gs { font-weight: bold } /* Generic.Strong */<br/>.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */<br/>.output_html .gt { color: #0044DD } /* Generic.Traceback */<br/>.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */<br/>.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */<br/>.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */<br/>.output_html .kp { color: #008000 } /* Keyword.Pseudo */<br/>.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */<br/>.output_html .kt { color: #B00040 } /* Keyword.Type */<br/>.output_html .m { color: #666666 } /* Literal.Number */<br/>.output_html .s { color: #BA2121 } /* Literal.String */<br/>.output_html .na { color: #687822 } /* Name.Attribute */<br/>.output_html .nb { color: #008000 } /* Name.Builtin */<br/>.output_html .nc { color: #0000FF; font-weight: bold } /* Name.Class */<br/>.output_html .no { color: #880000 } /* Name.Constant */<br/>.output_html .nd { color: #AA22FF } /* Name.Decorator */<br/>.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */<br/>.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */<br/>.output_html .nf { color: #0000FF } /* Name.Function */<br/>.output_html .nl { color: #767600 } /* Name.Label */<br/>.output_html .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */<br/>.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */<br/>.output_html .nv { color: #19177C } /* Name.Variable */<br/>.output_html .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */<br/>.output_html .w { color: #bbbbbb } /* Text.Whitespace */<br/>.output_html .mb { color: #666666 } /* Literal.Number.Bin */<br/>.output_html .mf { color: #666666 } /* Literal.Number.Float */<br/>.output_html .mh { color: #666666 } /* Literal.Number.Hex */<br/>.output_html .mi { color: #666666 } /* Literal.Number.Integer */<br/>.output_html .mo { color: #666666 } /* Literal.Number.Oct */<br/>.output_html .sa { color: #BA2121 } /* Literal.String.Affix */<br/>.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */<br/>.output_html .sc { color: #BA2121 } /* Literal.String.Char */<br/>.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */<br/>.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */<br/>.output_html .s2 { color: #BA2121 } /* Literal.String.Double */<br/>.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */<br/>.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */<br/>.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */<br/>.output_html .sx { color: #008000 } /* Literal.String.Other */<br/>.output_html .sr { color: #A45A77 } /* Literal.String.Regex */<br/>.output_html .s1 { color: #BA2121 } /* Literal.String.Single */<br/>.output_html .ss { color: #19177C } /* Literal.String.Symbol */<br/>.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */<br/>.output_html .fm { color: #0000FF } /* Name.Function.Magic */<br/>.output_html .vc { color: #19177C } /* Name.Variable.Class */<br/>.output_html .vg { color: #19177C } /* Name.Variable.Global */<br/>.output_html .vi { color: #19177C } /* Name.Variable.Instance */<br/>.output_html .vm { color: #19177C } /* Name.Variable.Magic */<br/>.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">apply_sharpen</span><span class=\"p\">(</span><br/><span class=\"w\">    </span><span class=\"n\">resize</span><span class=\"p\">(</span><br/><span class=\"w\">        </span><span class=\"n\">img</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">100</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">100</span><br/><span class=\"w\">    </span><span class=\"p\">)</span><br/><span class=\"p\">)</span><br/></pre></div></td>\n",
       "      <td id=\"T_bb6fb_row1_col2\" class=\"data row1 col2\" ><img src=\"\"></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_bb6fb_level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "      <td id=\"T_bb6fb_row2_col0\" class=\"data row2 col0\" >resize the image to 100, 100 and blur<br/>and apply sepia</td>\n",
       "      <td id=\"T_bb6fb_row2_col1\" class=\"data row2 col1\" ><style>pre { line-height: 125%; }<br/>td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>.output_html .hll { background-color: #ffffcc }<br/>.output_html { background: #f8f8f8; }<br/>.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */<br/>.output_html .err { border: 1px solid #FF0000 } /* Error */<br/>.output_html .k { color: #008000; font-weight: bold } /* Keyword */<br/>.output_html .o { color: #666666 } /* Operator */<br/>.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */<br/>.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */<br/>.output_html .cp { color: #9C6500 } /* Comment.Preproc */<br/>.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */<br/>.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */<br/>.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */<br/>.output_html .gd { color: #A00000 } /* Generic.Deleted */<br/>.output_html .ge { font-style: italic } /* Generic.Emph */<br/>.output_html .gr { color: #E40000 } /* Generic.Error */<br/>.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */<br/>.output_html .gi { color: #008400 } /* Generic.Inserted */<br/>.output_html .go { color: #717171 } /* Generic.Output */<br/>.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */<br/>.output_html .gs { font-weight: bold } /* Generic.Strong */<br/>.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */<br/>.output_html .gt { color: #0044DD } /* Generic.Traceback */<br/>.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */<br/>.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */<br/>.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */<br/>.output_html .kp { color: #008000 } /* Keyword.Pseudo */<br/>.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */<br/>.output_html .kt { color: #B00040 } /* Keyword.Type */<br/>.output_html .m { color: #666666 } /* Literal.Number */<br/>.output_html .s { color: #BA2121 } /* Literal.String */<br/>.output_html .na { color: #687822 } /* Name.Attribute */<br/>.output_html .nb { color: #008000 } /* Name.Builtin */<br/>.output_html .nc { color: #0000FF; font-weight: bold } /* Name.Class */<br/>.output_html .no { color: #880000 } /* Name.Constant */<br/>.output_html .nd { color: #AA22FF } /* Name.Decorator */<br/>.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */<br/>.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */<br/>.output_html .nf { color: #0000FF } /* Name.Function */<br/>.output_html .nl { color: #767600 } /* Name.Label */<br/>.output_html .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */<br/>.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */<br/>.output_html .nv { color: #19177C } /* Name.Variable */<br/>.output_html .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */<br/>.output_html .w { color: #bbbbbb } /* Text.Whitespace */<br/>.output_html .mb { color: #666666 } /* Literal.Number.Bin */<br/>.output_html .mf { color: #666666 } /* Literal.Number.Float */<br/>.output_html .mh { color: #666666 } /* Literal.Number.Hex */<br/>.output_html .mi { color: #666666 } /* Literal.Number.Integer */<br/>.output_html .mo { color: #666666 } /* Literal.Number.Oct */<br/>.output_html .sa { color: #BA2121 } /* Literal.String.Affix */<br/>.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */<br/>.output_html .sc { color: #BA2121 } /* Literal.String.Char */<br/>.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */<br/>.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */<br/>.output_html .s2 { color: #BA2121 } /* Literal.String.Double */<br/>.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */<br/>.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */<br/>.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */<br/>.output_html .sx { color: #008000 } /* Literal.String.Other */<br/>.output_html .sr { color: #A45A77 } /* Literal.String.Regex */<br/>.output_html .s1 { color: #BA2121 } /* Literal.String.Single */<br/>.output_html .ss { color: #19177C } /* Literal.String.Symbol */<br/>.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */<br/>.output_html .fm { color: #0000FF } /* Name.Function.Magic */<br/>.output_html .vc { color: #19177C } /* Name.Variable.Class */<br/>.output_html .vg { color: #19177C } /* Name.Variable.Global */<br/>.output_html .vi { color: #19177C } /* Name.Variable.Instance */<br/>.output_html .vm { color: #19177C } /* Name.Variable.Magic */<br/>.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">apply_sepia_filter</span><span class=\"p\">(</span><br/><span class=\"w\">    </span><span class=\"n\">apply_blur</span><span class=\"p\">(</span><br/><span class=\"w\">        </span><span class=\"n\">resize</span><span class=\"p\">(</span><br/><span class=\"w\">            </span><span class=\"n\">img</span><span class=\"p\">,</span><br/><span class=\"w\">            </span><span class=\"mi\">100</span><span class=\"p\">,</span><br/><span class=\"w\">            </span><span class=\"mi\">100</span><br/><span class=\"w\">        </span><span class=\"p\">)</span><br/><span class=\"w\">    </span><span class=\"p\">)</span><br/><span class=\"p\">)</span><br/></pre></div></td>\n",
       "      <td id=\"T_bb6fb_row2_col2\" class=\"data row2 col2\" ><img src=\"\"></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_bb6fb_level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "      <td id=\"T_bb6fb_row3_col0\" class=\"data row3 col0\" >resize the image to 100, 80, and then<br/>downscale it by another factor of 2x.</td>\n",
       "      <td id=\"T_bb6fb_row3_col1\" class=\"data row3 col1\" ><style>pre { line-height: 125%; }<br/>td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>.output_html .hll { background-color: #ffffcc }<br/>.output_html { background: #f8f8f8; }<br/>.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */<br/>.output_html .err { border: 1px solid #FF0000 } /* Error */<br/>.output_html .k { color: #008000; font-weight: bold } /* Keyword */<br/>.output_html .o { color: #666666 } /* Operator */<br/>.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */<br/>.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */<br/>.output_html .cp { color: #9C6500 } /* Comment.Preproc */<br/>.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */<br/>.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */<br/>.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */<br/>.output_html .gd { color: #A00000 } /* Generic.Deleted */<br/>.output_html .ge { font-style: italic } /* Generic.Emph */<br/>.output_html .gr { color: #E40000 } /* Generic.Error */<br/>.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */<br/>.output_html .gi { color: #008400 } /* Generic.Inserted */<br/>.output_html .go { color: #717171 } /* Generic.Output */<br/>.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */<br/>.output_html .gs { font-weight: bold } /* Generic.Strong */<br/>.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */<br/>.output_html .gt { color: #0044DD } /* Generic.Traceback */<br/>.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */<br/>.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */<br/>.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */<br/>.output_html .kp { color: #008000 } /* Keyword.Pseudo */<br/>.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */<br/>.output_html .kt { color: #B00040 } /* Keyword.Type */<br/>.output_html .m { color: #666666 } /* Literal.Number */<br/>.output_html .s { color: #BA2121 } /* Literal.String */<br/>.output_html .na { color: #687822 } /* Name.Attribute */<br/>.output_html .nb { color: #008000 } /* Name.Builtin */<br/>.output_html .nc { color: #0000FF; font-weight: bold } /* Name.Class */<br/>.output_html .no { color: #880000 } /* Name.Constant */<br/>.output_html .nd { color: #AA22FF } /* Name.Decorator */<br/>.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */<br/>.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */<br/>.output_html .nf { color: #0000FF } /* Name.Function */<br/>.output_html .nl { color: #767600 } /* Name.Label */<br/>.output_html .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */<br/>.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */<br/>.output_html .nv { color: #19177C } /* Name.Variable */<br/>.output_html .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */<br/>.output_html .w { color: #bbbbbb } /* Text.Whitespace */<br/>.output_html .mb { color: #666666 } /* Literal.Number.Bin */<br/>.output_html .mf { color: #666666 } /* Literal.Number.Float */<br/>.output_html .mh { color: #666666 } /* Literal.Number.Hex */<br/>.output_html .mi { color: #666666 } /* Literal.Number.Integer */<br/>.output_html .mo { color: #666666 } /* Literal.Number.Oct */<br/>.output_html .sa { color: #BA2121 } /* Literal.String.Affix */<br/>.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */<br/>.output_html .sc { color: #BA2121 } /* Literal.String.Char */<br/>.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */<br/>.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */<br/>.output_html .s2 { color: #BA2121 } /* Literal.String.Double */<br/>.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */<br/>.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */<br/>.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */<br/>.output_html .sx { color: #008000 } /* Literal.String.Other */<br/>.output_html .sr { color: #A45A77 } /* Literal.String.Regex */<br/>.output_html .s1 { color: #BA2121 } /* Literal.String.Single */<br/>.output_html .ss { color: #19177C } /* Literal.String.Symbol */<br/>.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */<br/>.output_html .fm { color: #0000FF } /* Name.Function.Magic */<br/>.output_html .vc { color: #19177C } /* Name.Variable.Class */<br/>.output_html .vg { color: #19177C } /* Name.Variable.Global */<br/>.output_html .vi { color: #19177C } /* Name.Variable.Instance */<br/>.output_html .vm { color: #19177C } /* Name.Variable.Magic */<br/>.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">downscale</span><span class=\"p\">(</span><br/><span class=\"w\">    </span><span class=\"n\">resize</span><span class=\"p\">(</span><br/><span class=\"w\">        </span><span class=\"n\">img</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">100</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">80</span><br/><span class=\"w\">    </span><span class=\"p\">),</span><br/><span class=\"w\">    </span><span class=\"mi\">2</span><br/><span class=\"p\">)</span><br/></pre></div></td>\n",
       "      <td id=\"T_bb6fb_row3_col2\" class=\"data row3 col2\" ><img src=\"\"></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_bb6fb_level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "      <td id=\"T_bb6fb_row4_col0\" class=\"data row4 col0\" >resize the image to 100, 90, and detect<br/>edges</td>\n",
       "      <td id=\"T_bb6fb_row4_col1\" class=\"data row4 col1\" ><style>pre { line-height: 125%; }<br/>td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>.output_html .hll { background-color: #ffffcc }<br/>.output_html { background: #f8f8f8; }<br/>.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */<br/>.output_html .err { border: 1px solid #FF0000 } /* Error */<br/>.output_html .k { color: #008000; font-weight: bold } /* Keyword */<br/>.output_html .o { color: #666666 } /* Operator */<br/>.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */<br/>.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */<br/>.output_html .cp { color: #9C6500 } /* Comment.Preproc */<br/>.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */<br/>.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */<br/>.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */<br/>.output_html .gd { color: #A00000 } /* Generic.Deleted */<br/>.output_html .ge { font-style: italic } /* Generic.Emph */<br/>.output_html .gr { color: #E40000 } /* Generic.Error */<br/>.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */<br/>.output_html .gi { color: #008400 } /* Generic.Inserted */<br/>.output_html .go { color: #717171 } /* Generic.Output */<br/>.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */<br/>.output_html .gs { font-weight: bold } /* Generic.Strong */<br/>.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */<br/>.output_html .gt { color: #0044DD } /* Generic.Traceback */<br/>.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */<br/>.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */<br/>.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */<br/>.output_html .kp { color: #008000 } /* Keyword.Pseudo */<br/>.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */<br/>.output_html .kt { color: #B00040 } /* Keyword.Type */<br/>.output_html .m { color: #666666 } /* Literal.Number */<br/>.output_html .s { color: #BA2121 } /* Literal.String */<br/>.output_html .na { color: #687822 } /* Name.Attribute */<br/>.output_html .nb { color: #008000 } /* Name.Builtin */<br/>.output_html .nc { color: #0000FF; font-weight: bold } /* Name.Class */<br/>.output_html .no { color: #880000 } /* Name.Constant */<br/>.output_html .nd { color: #AA22FF } /* Name.Decorator */<br/>.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */<br/>.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */<br/>.output_html .nf { color: #0000FF } /* Name.Function */<br/>.output_html .nl { color: #767600 } /* Name.Label */<br/>.output_html .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */<br/>.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */<br/>.output_html .nv { color: #19177C } /* Name.Variable */<br/>.output_html .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */<br/>.output_html .w { color: #bbbbbb } /* Text.Whitespace */<br/>.output_html .mb { color: #666666 } /* Literal.Number.Bin */<br/>.output_html .mf { color: #666666 } /* Literal.Number.Float */<br/>.output_html .mh { color: #666666 } /* Literal.Number.Hex */<br/>.output_html .mi { color: #666666 } /* Literal.Number.Integer */<br/>.output_html .mo { color: #666666 } /* Literal.Number.Oct */<br/>.output_html .sa { color: #BA2121 } /* Literal.String.Affix */<br/>.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */<br/>.output_html .sc { color: #BA2121 } /* Literal.String.Char */<br/>.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */<br/>.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */<br/>.output_html .s2 { color: #BA2121 } /* Literal.String.Double */<br/>.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */<br/>.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */<br/>.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */<br/>.output_html .sx { color: #008000 } /* Literal.String.Other */<br/>.output_html .sr { color: #A45A77 } /* Literal.String.Regex */<br/>.output_html .s1 { color: #BA2121 } /* Literal.String.Single */<br/>.output_html .ss { color: #19177C } /* Literal.String.Symbol */<br/>.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */<br/>.output_html .fm { color: #0000FF } /* Name.Function.Magic */<br/>.output_html .vc { color: #19177C } /* Name.Variable.Class */<br/>.output_html .vg { color: #19177C } /* Name.Variable.Global */<br/>.output_html .vi { color: #19177C } /* Name.Variable.Instance */<br/>.output_html .vm { color: #19177C } /* Name.Variable.Magic */<br/>.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">apply_find_edges</span><span class=\"p\">(</span><br/><span class=\"w\">    </span><span class=\"n\">resize</span><span class=\"p\">(</span><br/><span class=\"w\">        </span><span class=\"n\">img</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">100</span><span class=\"p\">,</span><br/><span class=\"w\">        </span><span class=\"mi\">90</span><br/><span class=\"w\">    </span><span class=\"p\">)</span><br/><span class=\"p\">)</span><br/></pre></div></td>\n",
       "      <td id=\"T_bb6fb_row4_col2\" class=\"data row4 col2\" ><img src=\"\"></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_bb6fb_level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
       "      <td id=\"T_bb6fb_row5_col0\" class=\"data row5 col0\" >resize the image to 100, 80, detect<br/>edges and finally apply sepia.</td>\n",
       "      <td id=\"T_bb6fb_row5_col1\" class=\"data row5 col1\" ><style>pre { line-height: 125%; }<br/>td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }<br/>td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }<br/>.output_html .hll { background-color: #ffffcc }<br/>.output_html { background: #f8f8f8; }<br/>.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */<br/>.output_html .err { border: 1px solid #FF0000 } /* Error */<br/>.output_html .k { color: #008000; font-weight: bold } /* Keyword */<br/>.output_html .o { color: #666666 } /* Operator */<br/>.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */<br/>.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */<br/>.output_html .cp { color: #9C6500 } /* Comment.Preproc */<br/>.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */<br/>.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */<br/>.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */<br/>.output_html .gd { color: #A00000 } /* Generic.Deleted */<br/>.output_html .ge { font-style: italic } /* Generic.Emph */<br/>.output_html .gr { color: #E40000 } /* Generic.Error */<br/>.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */<br/>.output_html .gi { color: #008400 } /* Generic.Inserted */<br/>.output_html .go { color: #717171 } /* Generic.Output */<br/>.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */<br/>.output_html .gs { font-weight: bold } /* Generic.Strong */<br/>.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */<br/>.output_html .gt { color: #0044DD } /* Generic.Traceback */<br/>.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */<br/>.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */<br/>.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */<br/>.output_html .kp { color: #008000 } /* Keyword.Pseudo */<br/>.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */<br/>.output_html .kt { color: #B00040 } /* Keyword.Type */<br/>.output_html .m { color: #666666 } /* Literal.Number */<br/>.output_html .s { color: #BA2121 } /* Literal.String */<br/>.output_html .na { color: #687822 } /* Name.Attribute */<br/>.output_html .nb { color: #008000 } /* Name.Builtin */<br/>.output_html .nc { color: #0000FF; font-weight: bold } /* Name.Class */<br/>.output_html .no { color: #880000 } /* Name.Constant */<br/>.output_html .nd { color: #AA22FF } /* Name.Decorator */<br/>.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */<br/>.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */<br/>.output_html .nf { color: #0000FF } /* Name.Function */<br/>.output_html .nl { color: #767600 } /* Name.Label */<br/>.output_html .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */<br/>.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */<br/>.output_html .nv { color: #19177C } /* Name.Variable */<br/>.output_html .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */<br/>.output_html .w { color: #bbbbbb } /* Text.Whitespace */<br/>.output_html .mb { color: #666666 } /* Literal.Number.Bin */<br/>.output_html .mf { color: #666666 } /* Literal.Number.Float */<br/>.output_html .mh { color: #666666 } /* Literal.Number.Hex */<br/>.output_html .mi { color: #666666 } /* Literal.Number.Integer */<br/>.output_html .mo { color: #666666 } /* Literal.Number.Oct */<br/>.output_html .sa { color: #BA2121 } /* Literal.String.Affix */<br/>.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */<br/>.output_html .sc { color: #BA2121 } /* Literal.String.Char */<br/>.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */<br/>.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */<br/>.output_html .s2 { color: #BA2121 } /* Literal.String.Double */<br/>.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */<br/>.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */<br/>.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */<br/>.output_html .sx { color: #008000 } /* Literal.String.Other */<br/>.output_html .sr { color: #A45A77 } /* Literal.String.Regex */<br/>.output_html .s1 { color: #BA2121 } /* Literal.String.Single */<br/>.output_html .ss { color: #19177C } /* Literal.String.Symbol */<br/>.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */<br/>.output_html .fm { color: #0000FF } /* Name.Function.Magic */<br/>.output_html .vc { color: #19177C } /* Name.Variable.Class */<br/>.output_html .vg { color: #19177C } /* Name.Variable.Global */<br/>.output_html .vi { color: #19177C } /* Name.Variable.Instance */<br/>.output_html .vm { color: #19177C } /* Name.Variable.Magic */<br/>.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">apply_sepia_filter</span><span class=\"p\">(</span><br/><span class=\"w\">    </span><span class=\"n\">apply_find_edges</span><span class=\"p\">(</span><br/><span class=\"w\">        </span><span class=\"n\">resize</span><span class=\"p\">(</span><br/><span class=\"w\">            </span><span class=\"n\">img</span><span class=\"p\">,</span><br/><span class=\"w\">            </span><span class=\"mi\">100</span><span class=\"p\">,</span><br/><span class=\"w\">            </span><span class=\"mi\">80</span><br/><span class=\"w\">        </span><span class=\"p\">)</span><br/><span class=\"w\">    </span><span class=\"p\">)</span><br/><span class=\"p\">)</span><br/></pre></div></td>\n",
       "      <td id=\"T_bb6fb_row5_col2\" class=\"data row5 col2\" ><img src=\"\"></td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "display_html_results(html_results, columns=[\"query\", \"code\", \"result\"])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
